#ifndef DEVICE_SWITCH_H
#define DEVICE_SWITCH_H
#include <Ticker.h>
#include <map>
#include <string>

#define SCAN_INTERVAL         100     // 键盘扫描周期(ms)
#define KEY_TRIGGER_METHOD    HIGH    // 按键触发方式：HIGH/LOW
#define KEY_DOWN_PIN          2       // 下功能按键引脚 GPIO02 <==> D4
#define KEY_UP_PIN            10      // 上功能按键引脚 GPIO10 <==> SD3
#define KEY_OK_PIN            0       // 上功能按键引脚 GPIO00 <==> D3

// 按键名称
enum class KEY_NAME {
    KEY_DOWN = 0,
    KEY_UP,
    KEY_OK,
    KEY_DEFAULT = 0xFF
};

class SwitchControl {
    // 按键管理器
    struct KeyManager
    {
        bool keyPressFlag{false};
        std::function<void()> keyCallback{nullptr};
    };
public:
    ~SwitchControl();
    void init(void);
    void setKeyCallback(KEY_NAME key_name, std::function<void()> callback);
private:
    void scanCallback();
private:
    Ticker *m_switchScanner{nullptr};
    std::map<KEY_NAME, KeyManager> m_keyManagerMap;
    std::map<KEY_NAME, uint8_t> m_keyPinMap;
    std::map<KEY_NAME, String> m_keyNameMap;
};

#endif